package sessionbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import dtofactory.FactoryDTO;
import entities.CantidadArticulo;
import entities.CentroDeDistribucion;
import entities.EnvioCentroDistribucion;
import entities.MateriaPrima;
import entities.PedidoFabricacion;
import entities.SolicitudFabricacion;
import entitiesdto.EnvioCentroDistribucionDTO;
import entitiesdto.MateriaPrimaDTO;
import entitiesdto.PedidoFabricacionDTO;
import sessionbeans.AdminDistribucion;

public @Stateless
class AdminDistribucionBean implements AdminDistribucion {

	@PersistenceContext
	private EntityManager manager;
	private FactoryDTO dtoFactory;

	public AdminDistribucionBean() {
		dtoFactory = FactoryDTO.getInstance();
	}
	
	@SuppressWarnings("unchecked")
	public List<PedidoFabricacionDTO> getPedidosFabricacion() {
		List<PedidoFabricacion> pf = manager.createQuery("select p from PedidoFabricacion p").getResultList();
		List<PedidoFabricacionDTO> result = new ArrayList<PedidoFabricacionDTO>();
		for(PedidoFabricacion pedido : pf){
			PedidoFabricacionDTO ped= FactoryDTO.getInstance().pedFabToDTO(pedido);
			result.add(ped);
		}
		return result;
	}
	
	@SuppressWarnings("unchecked")
	public List<EnvioCentroDistribucionDTO>  generarReposicionArticulos() {
		List<EnvioCentroDistribucionDTO> envios = new Vector<EnvioCentroDistribucionDTO>();
		List<CentroDeDistribucion> centros = manager.createQuery("select c from CentroDeDistribucion c").getResultList();
		for (CentroDeDistribucion centro : centros) {

			List<SolicitudFabricacion> solicitudesf = manager
					.createQuery(
							"select sf from SolicitudFabricacion sf where sf.CD=?1 order by fechaSolicitud")
					.setParameter(1, centro).getResultList();
//			SolicitudFabricacion solicitud = (SolicitudFabricacion) manager.createQuery("select sf from SolicitudFabricacion sf where sf.CD=?1").setParameter(1, centro).getSingleResult();
			for (SolicitudFabricacion solicitud : solicitudesf) {
				EnvioCentroDistribucion envC = new EnvioCentroDistribucion();
				List<CantidadArticulo> cantidadArticulos = new Vector<CantidadArticulo>();
				for (CantidadArticulo cantidadArti : solicitud.getArticulos()) {
					PedidoFabricacion pf = (PedidoFabricacion) manager
							.createQuery(
									"select p from PedidoFabricacion p where p.articulo=?1")
							.setParameter(1, cantidadArti.getArticulo())
							.getSingleResult();
					if (pf.getCantidadFabricada() >= cantidadArti
							.getCantidadPedida()) {
						CantidadArticulo can = new CantidadArticulo();
						can.setArticulo(cantidadArti.getArticulo());
						can.setCantidadPedida(cantidadArti.getCantidadPedida());
						cantidadArticulos.add(can);
						pf.setCantidadFabricada(pf.getCantidadFabricada()
								- can.getCantidadPedida());
						pf.setCantidadSolicitada(pf.getCantidadSolicitada()
								- can.getCantidadPedida());
						cantidadArti.setCantidadPedida(0);
//						manager.merge(solicitud);
						manager.merge(pf);
					} else {
						if (pf.getCantidadFabricada() > 0) {
							CantidadArticulo can = new CantidadArticulo();
							can.setArticulo(cantidadArti.getArticulo());
							can.setCantidadPedida(pf.getCantidadFabricada());
							cantidadArticulos.add(can);
							pf.setCantidadFabricada(0);
							pf.setCantidadSolicitada(pf.getCantidadSolicitada()
									- can.getCantidadPedida());
							cantidadArti.setCantidadPedida(cantidadArti
									.getCantidadPedida()
									- can.getCantidadPedida());
							manager.merge(solicitud);
							manager.merge(pf);
						}
					}
				}
				envC.setSolFabr(solicitud);
				envC.setArticulos(cantidadArticulos);
				envC.setCd(solicitud.getCD());
				manager.persist(envC);
				envios.add(dtoFactory.envtoDTO(envC));
			}
			for(SolicitudFabricacion sol : solicitudesf){
				manager.persist(sol);
			}
		}

		return envios;
	}

}
